<?php

/**
 * Lớp cơ sở cho các controller
 */
class Controller
{
    protected $_model;
    protected $_action;
    protected $_view;
    protected $_controller;

    public function __construct($action = 'view')
    {
        $this->_action = $action;
        preg_match('/(\w+)Controller/', get_class($this), $match);
        $this->_controller = $match[1];

        # khởi tạo Model
        $this->_model = new $this->_controller;
        $this->{$this->_controller} =& $this->_model;
        /*
        try {
            $this->_model = new $this->_controller;
        } catch (Exception $ex) {
            throw new Exception("Model <strong>{$this->_controller}</strong> không tồn tại!", 106);
        }
        */

        if (!method_exists($this, $this->_action)) {
            throw new Exception("Action <strong>{$action}</strong> trên đối tượng <strong>{$this->_controller}</strong> " .
                "không tồn tại!", 109);
        }
        # Khởi tạo template
        $this->_view = new View($this->_controller, $this->_action);
    }

    /**
     * Gán 1 cắp $name => $value vào template main hoặc template của controller
     * @param $key string | array
     * @param $value
     * @param bool $wrap true: gán cho template main, false: gán cho template của controller (con bên trong)
     */
    function assign($key, $value = null, $wrap = false)
    {
        if ($wrap) {
            $this->_view->wrapAssign($key, $value);
        } else {
            $this->_view->assign($key, $value);
        }
    }


    function __destruct()
    {
        $this->_view->render();
    }
}